
## 脚手架命令注册和执行过程开发
基于Commander完成脚手架命令注册和命令执行过程开发

### 收获
- 如何设计高性能脚手架
- Node多线程开发
- javascript面向对象编程的实战技巧

## 脚手架初始化+全局参数注册
本节的主要内容为使用commander这个库在全局添加注册命令

cd core/cli  
npm i -S commander  

```js
// core/cli/lib/index  添加全局注册命令方法
//命令注册
function registerCommand(){
    program
        .name(Object.keys(pkg.bin)[0])
        .usage('<command> [options]')
        .version(pkg.version)
        .option('-d, --debug', '是否开启调试模式', false);

     // 开启debug模式
     program.on('option:debug',function(){
        if(program.opts().debug){
            process.env.LOG_LEVEL='verbose'
        }else{
            process.env.LOG_LEVEL='info'
        }
        log.level = process.env.LOG_LEVEL
    })

    // 对未知命令监听
    program.on('command:*',function(obj){
        const availableCommands = program.commands.map(cmd => cmd.name())
        console.log(colors.red('未知的命令：'+obj[0]))
        if(availableCommands.length > 0){
            console.log(colors.red('可用命令为：'+availableCommands.join(',')))
        }
    })


    program.parse(program.argv)
    if(program.args && program.args.length < 1) {
        program.outputHelp();
        console.log()
    }
}
```

## 脚手架命令注册

本节的主要内容为添加第一个comman操作：'init',并在commands文件夹下创建新的init包
```js
// core/cli/lib/index
......

const init = require('@cloudscope-cli/init')

......

program
  .command('init [projectName]')
    .option('-f,--force','是否强制更新项目')
    .action(init)

......

```